{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true,
    "jupyter": {
     "outputs_hidden": true
    }
   },
   "source": [
    "## Application of batch-mode regression to cross-validation\n",
    "\n",
    "botorch provides a helper function `gen_loo_cv_folds` to easily perform leave-one-out (LOO) cross-validation (CV) by taking advantage of batch-mode regression and evaluation in GPyTorch. This tutorial illustrates the process on a noisy sinusoidal function, similar to the example from the batch-mode GP regression [tutorial](https://github.com/cornellius-gp/gpytorch/blob/master/examples/01_Exact_GPs/Simple_GP_Regression.ipynb) from GPyTorch:\n",
    "\n",
    "$$y = \\sin(2\\pi x) + \\epsilon, ~\\epsilon \\sim \\mathcal N(0, 0.2).$$\n",
    "\n",
    "Note: this tutorial aims to introduce batch-mode regression and evaluation in GPyTorch with CV as an example application. For alternative, more user-friendly functions to perform CV in Ax, see [ax.adapter.cross_validation](https://github.com/facebook/Ax/blob/main/ax/adapter/cross_validation.py). However, for larger CV tasks, it may be useful to exploit GPyTorch batch-mode, as shown in this tutorial."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Install dependencies if we are running in colab\n",
    "import sys\n",
    "if 'google.colab' in sys.modules:\n",
    "    %pip install botorch"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import torch\n",
    "import math\n",
    "\n",
    "device = torch.device(\"cpu\")\n",
    "dtype = torch.float64\n",
    "torch.manual_seed(3);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Initialize the CV dataset\n",
    "\n",
    "For our training data, we take 20 regularly spaced points on the interval $[0, 1]$ and generate noisy evaluations with an observed noise variance of 0.2. Remember that botorch requires an explicit output dimension."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "sigma = math.sqrt(0.2)\n",
    "train_X = torch.linspace(0, 1, 20, dtype=dtype, device=device).view(-1, 1)\n",
    "train_Y_noiseless = torch.sin(train_X * (2 * math.pi))\n",
    "train_Y = train_Y_noiseless + sigma * torch.randn_like(train_Y_noiseless)\n",
    "train_Yvar = torch.full_like(train_Y, 0.2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The botorch function `gen_loo_cv_folds` takes our observed data `train_X`, `train_Y`, `train_Yvar` as input and returns the LOO CV folds in a `CVFolds` object."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[KeOps] Warning : omp.h header is not in the path, disabling OpenMP. To fix this, you can set the environment\n",
      "                  variable OMP_PATH to the location of the header before importing keopscore or pykeops,\n",
      "                  e.g. using os.environ: import os; os.environ['OMP_PATH'] = '/path/to/omp/header'\n",
      "[KeOps] Warning : Cuda libraries were not detected on the system or could not be loaded ; using cpu only mode\n"
     ]
    }
   ],
   "source": [
    "from botorch.cross_validation import gen_loo_cv_folds\n",
    "\n",
    "cv_folds = gen_loo_cv_folds(train_X=train_X, train_Y=train_Y, train_Yvar=train_Yvar)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The `cv_folds` object contains the data, stored as tensors of appropriate batch shape, necessary to perform 20 CVs of 19 training points and 1 test point. For example, we can check that the shapes of the training inputs and training targets are `b x n x d = 20 x 19 x 1` and `b x n x o = 20 x 19 x 1` respectively, where `o` is the number of outputs."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(torch.Size([20, 19, 1]), torch.Size([20, 19, 1]))"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cv_folds.train_X.shape, cv_folds.train_Y.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(torch.Size([20, 1, 1]), torch.Size([20, 1, 1]))"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cv_folds.test_X.shape, cv_folds.test_Y.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Note that in a situation where the dataset is large, one may not want to perform LOO; in that case, a similar process can be used to perform $k$-fold CV."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Perform LOOCV\n",
    "\n",
    "We can use the `batch_cross_validation` function to perform LOOCV using batching (meaning that the `b = 20` sets of training data can be fit as `b = 20` separate GP models with separate hyperparameters in parallel through GPyTorch) and return a CVResult tuple with the batched `GPyTorchPosterior` object over the LOOCV test points and the observed targets. The `batch_cross_validation` requires a model class (`model_cls`) and a marginal log likelihood class (`mll_cls`). We will use the SingleTaskGP as the `model_cls` and an ExactMarginalLogLikelihood as the `mll_cls`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "from botorch.cross_validation import batch_cross_validation\n",
    "from botorch.models import SingleTaskGP\n",
    "from botorch.models.transforms.input import Normalize\n",
    "from botorch.models.transforms.outcome import Standardize\n",
    "from gpytorch.mlls.exact_marginal_log_likelihood import ExactMarginalLogLikelihood\n",
    "\n",
    "input_transform = Normalize(d=train_X.shape[-1])\n",
    "outcome_transform = Standardize(\n",
    "    m=train_Y.shape[-1],\n",
    "    batch_shape=cv_folds.train_Y.shape[:-2],\n",
    ")\n",
    "\n",
    "# instantiate and fit model\n",
    "cv_results = batch_cross_validation(\n",
    "    model_cls=SingleTaskGP,\n",
    "    mll_cls=ExactMarginalLogLikelihood,\n",
    "    cv_folds=cv_folds,\n",
    "    model_init_kwargs={\n",
    "        \"input_transform\": input_transform,\n",
    "        \"outcome_transform\": outcome_transform,\n",
    "    },\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Compute the cross-validation error and generate plots\n",
    "To compute the cross-validation error, we first evaluate the test points by computing the posterior in batch mode. Next, we compute the squared errors for each test point from the prediction and take an average across all cross-validation folds."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Cross-validation error:  0.11\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 600x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from matplotlib import pyplot as plt\n",
    "\n",
    "%matplotlib inline\n",
    "\n",
    "posterior = cv_results.posterior\n",
    "mean = posterior.mean\n",
    "cv_error = ((cv_folds.test_Y.squeeze() - mean.squeeze()) ** 2).mean()\n",
    "print(f\"Cross-validation error: {cv_error : 4.2}\")\n",
    "\n",
    "# get lower and upper confidence bounds\n",
    "lower, upper = posterior.mvn.confidence_region()\n",
    "\n",
    "# scatterplot of predicted versus test\n",
    "_, axes = plt.subplots(1, 1, figsize=(6, 4))\n",
    "plt.plot([-1.5, 1.5], [-1.5, 1.5], \"k\", label=\"true objective\", linewidth=2)\n",
    "\n",
    "axes.set_xlabel(\"Actual\")\n",
    "axes.set_ylabel(\"Predicted\")\n",
    "\n",
    "axes.errorbar(\n",
    "    x=cv_folds.test_Y.numpy().flatten(),\n",
    "    y=mean.numpy().flatten(),\n",
    "    xerr=1.96 * sigma,\n",
    "    yerr=((upper - lower) / 2).numpy().flatten(),\n",
    "    fmt=\"*\",\n",
    ");"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Finally, we can visualize the fitted models. To do this, we again take advantage of batch-mode evaluation to obtain predictions, including lower and upper confidence regions, from each of the 20 models."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "model = cv_results.model\n",
    "with torch.no_grad():\n",
    "    # evaluate the models at a series of points for plotting\n",
    "    plot_x = (\n",
    "        torch.linspace(0, 1, 101).view(1, -1, 1).repeat(cv_folds.train_X.shape[0], 1, 1)\n",
    "    )\n",
    "    posterior = model.posterior(plot_x)\n",
    "    mean = posterior.mean\n",
    "\n",
    "    # get lower and upper confidence bounds\n",
    "    lower, upper = posterior.mvn.confidence_region()\n",
    "    plot_x.squeeze_()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The code snippet below plots the result for the 12th CV fold (by setting `num = 12`), but note that we have computed the results for all folds above (other plots can be obtained by iterating `num` from 1 to 20)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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rifXtGvJ9ex6ck27lr+vZ8hNohRCCCGE9qQHQgghhBBekwRCCCGEEF6TBEIIIYQQXpMEQgghhBBekwTiR4sWLaJHjx6YzWbGjx/PunXrjnn8kiVLGDBgAGazmaFDh7J06VIfRRo8vLmmzz33HKeccgqxsbHExsYyderU4/4MuiNvf08PeeONN1AUhQsuuEDbAIOMt9eztraWm2++mdTUVEwmE/369ZO//V/w9po+8cQT9O/fn/DwcDIzM7nttttobm72UbSB7euvv2bGjBmkpaWhKArvv//+cc9ZtWoVo0aNwmQy0adPHxYvXqxdgKpQ33jjDdVoNKovvPCCun37dvX6669XY2Ji1LKysnaP//bbb1W9Xq8+8sgj6o4dO9Q//elPqsFgULdu3erjyAOXt9f0iiuuUBctWqRu2rRJ3blzp3r11Ver0dHRamFhoY8jD1zeXtNDDhw4oKanp6unnHKKev755/sm2CDg7fV0OBzqmDFj1HPOOUddvXq1euDAAXXVqlVqTk6OjyMPXN5e01dffVU1mUzqq6++qh44cED97LPP1NTUVPW2227zceSBaenSpeof//hH9d1331UB9b333jvm8fv371ctFos6f/58dceOHepTTz2l6vV6ddmyZZrEJwmEqqrjxo1Tb7755rZ/u91uNS0tTV2wYEG7x1966aXqueeee9hz48ePV3/9619rGmcw8faa/pLL5VKjoqLUF198UasQg05nrqnL5VInTpyoPv/88+pVV10lCcTPeHs9//3vf6u9evVSW1pafBVi0PH2mt58883qGWeccdhz8+fPV08++WRN4wxGHUkg7rrrLnXw4MGHPTd79mx12rRpmsTU7YcwWlpa2LBhA1OnTm17TqfTMXXqVNasWdPuOWvWrDnseIBp06Yd9fjupjPX9JcaGxtxOp3ExcVpFWZQ6ew1/etf/0pSUhLXXnutL8IMGp25nh9++CETJkzg5ptvJjk5mSFDhvCPf/wDt9vtq7ADWmeu6cSJE9mwYUPbMMf+/ftZunQp55xzjk9iDjW+vjeF3GZa3qqsrMTtdpOcnHzY88nJyezatavdc0pLS9s9vrS0VLM4g0lnrukv3X333aSlpR3xx9Bddeaarl69mv/+97/k5OT4IMLg0pnruX//fr744gvmzJnD0qVLyc3N5Te/+Q1Op5P777/fF2EHtM5c0yuuuILKykomTZqEqqq4XC5uvPFG/vCHP/gi5JBztHuT3W6nqamJ8PDwLm2v2/dAiMDz0EMP8cYbb/Dee+9hNpv9HU5QqqurY+7cuTz33HMkJCT4O5yQ4PF4SEpK4tlnn2X06NHMnj2bP/7xjzzzzDP+Di1orVq1in/84x88/fTTbNy4kXfffZdPPvmEv/3tb/4OTXRAt++BSEhIQK/XU1ZWdtjzZWVlpKSktHtOSkqKV8d3N525poc8+uijPPTQQ6xYsYJhw4ZpGWZQ8faa7tu3j4MHDzJjxoy25zweDwBhYWHs3r2b3r17axt0AOvM72hqaioGgwG9Xt/23MCBAyktLaWlpQWj0ahpzIGuM9f0z3/+M3PnzuW6664DYOjQoTQ0NHDDDTfwxz/+EZ1OPuN642j3JqvV2uW9DyA9EBiNRkaPHs3KlSvbnvN4PKxcuZIJEya0e86ECRMOOx5g+fLlRz2+u+nMNQV45JFH+Nvf/sayZcsYM2aML0INGt5e0wEDBrB161ZycnLaHjNnzmTy5Mnk5OSQmZnpy/ADTmd+R08++WRyc3PbEjGAPXv2kJqa2u2TB+jcNW1sbDwiSTiUoKmyTZPXfH5v0mRqZpB54403VJPJpC5evFjdsWOHesMNN6gxMTFqaWmpqqqqOnfuXPWee+5pO/7bb79Vw8LC1EcffVTduXOnev/998syzl/w9po+9NBDqtFoVN9++221pKSk7VFXV+evbyHgeHtNf0lWYRzO2+uZn5+vRkVFqbfccou6e/du9eOPP1aTkpLUBx980F/fQsDx9pref//9alRUlPr666+r+/fvVz///HO1d+/e6qWXXuqvbyGg1NXVqZs2bVI3bdqkAurjjz+ubtq0Sc3Ly1NVVVXvuecede7cuW3HH1rGeeedd6o7d+5UFy1aJMs4feGpp55Ss7KyVKPRqI4bN079/vvv27522mmnqVddddVhx7/11ltqv379VKPRqA4ePFj95JNPfBxx4PPmmmZnZ6vAEY/777/f94EHMG9/T39OEogjeXs9v/vuO3X8+PGqyWRSe/Xqpf79739XXS6Xj6MObN5cU6fTqf7lL39Re/furZrNZjUzM1P9zW9+o9bU1Pg+8AD05Zdftvu+eOgaXnXVVeppp512xDkjRoxQjUaj2qtXL/V///ufZvHJdt5CCCGE8Fq3nwMhhBBCCO9JAiGEEEIIr0kCIYQQQgivSQIhhBBCCK9JAiGEEEIIr0kCIYQQQgivSQIhhBBCCK9JAiGEEEIIr0kCIYQQQgivSQIhhBBCCK9JAiGEEEIIr0kCIYQQQgiv/T+UzCM0lKRJSwAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 600x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "_, axes = plt.subplots(1, 1, figsize=(6, 4))\n",
    "\n",
    "# plot the 12th CV fold\n",
    "num = 12\n",
    "\n",
    "# plot the training data in black\n",
    "axes.plot(\n",
    "    cv_folds.train_X[num - 1].detach().numpy(),\n",
    "    cv_folds.train_Y[num - 1].detach().numpy(),\n",
    "    \"k*\",\n",
    ")\n",
    "\n",
    "# plot the test data in red\n",
    "axes.plot(\n",
    "    cv_folds.test_X[num - 1].detach().numpy(),\n",
    "    cv_folds.test_Y[num - 1].detach().numpy(),\n",
    "    \"r*\",\n",
    ")\n",
    "\n",
    "# plot posterior means as blue line\n",
    "axes.plot(plot_x[num - 1].numpy(), mean[num - 1].numpy(), \"b\")\n",
    "\n",
    "# shade between the lower and upper confidence bounds\n",
    "axes.fill_between(\n",
    "    plot_x[num - 1].numpy(), lower[num - 1].numpy(), upper[num - 1].numpy(), alpha=0.5\n",
    ");"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true,
    "jupyter": {
     "outputs_hidden": true
    }
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "fileHeader": "",
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
